]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
networkAgent: Make searching VPN binaries asynchronous
authorFlorian Müllner <fmuellner@gnome.org>
Sat, 14 Mar 2020 21:01:00 +0000 (22:01 +0100)
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Tue, 17 Mar 2020 14:07:15 +0000 (14:07 +0000)
Doing blocking IO in a graphical UI is bad, doing it in the compositor
is much much worse. So even if handling VPN requests is a relatively
rare event, doing it asynchronously is better.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/2386

js/ui/components/networkAgent.js

index c0f00f5a2aa08934d156eca43fac301324a3b201..05d52ee868f38fbc748574aec8caf8fd29c4b4cf 100644 (file)
@@ -4,13 +4,15 @@
 const { Clutter, Gio, GLib, GObject, NM, Pango, Shell, St } = imports.gi;
 const Signals = imports.signals;
 
-const Config = imports.misc.config;
 const Dialog = imports.ui.dialog;
 const Main = imports.ui.main;
 const MessageTray = imports.ui.messageTray;
 const ModalDialog = imports.ui.modalDialog;
 const ShellEntry = imports.ui.shellEntry;
 
+Gio._promisify(Shell.NetworkAgent.prototype,
+    'search_vpn_plugin', 'search_vpn_plugin_finish');
+
 const VPN_UI_GROUP = 'VPN Plugin UI';
 
 var NetworkSecretDialog = GObject.registerClass(
@@ -758,11 +760,11 @@ var NetworkAgent = class {
         }
     }
 
-    _vpnRequest(requestId, connection, hints, flags) {
+    async _vpnRequest(requestId, connection, hints, flags) {
         let vpnSetting = connection.get_setting_vpn();
         let serviceType = vpnSetting.service_type;
 
-        let binary = this._findAuthBinary(serviceType);
+        let binary = await this._findAuthBinary(serviceType);
         if (!binary) {
             log('Invalid VPN service type (cannot find authentication binary)');
 
@@ -778,11 +780,15 @@ var NetworkAgent = class {
         this._vpnRequests[requestId] = vpnRequest;
     }
 
-    _findAuthBinary(serviceType) {
-        const plugin = NM.VpnPluginInfo.new_search_file(null, serviceType);
+    async _findAuthBinary(serviceType) {
+        let plugin;
 
-        if (plugin === null)
+        try {
+            plugin = await this._native.search_vpn_plugin(serviceType);
+        } catch (e) {
+            logError(e);
             return null;
+        }
 
         const fileName = plugin.get_auth_dialog();
         if (!GLib.file_test(fileName, GLib.FileTest.IS_EXECUTABLE)) {